home *** CD-ROM | disk | FTP | other *** search
- #include "proctext.h"
-
- /* Coefficients of basis matrix. */
- #define CR00 -0.5
- #define CR01 1.5
- #define CR02 -1.5
- #define CR03 0.5
- #define CR10 1.0
- #define CR11 -2.5
- #define CR12 2.0
- #define CR13 -0.5
- #define CR20 -0.5
- #define CR21 0.0
- #define CR22 0.5
- #define CR23 0.0
- #define CR30 0.0
- #define CR31 1.0
- #define CR32 0.0
- #define CR33 0.0
-
- float
- spline(float x, int nknots, float *knot)
- {
- int span;
- int nspans = nknots - 3;
- float c0, c1, c2, c3; /* coefficients of the cubic.*/
-
- if (nspans < 1) { /* illegal */
- fprintf(stderr, "Spline has too few knots.\n");
- return 0;
- }
-
- /* Find the appropriate 4-point span of the spline. */
- x = clamp(x, 0, 1) * nspans;
- span = (int) x;
- if (span >= nknots - 3)
- span = nknots - 3;
- x -= span;
- knot += span;
-
- /* Evaluate the span cubic at x using Horner's rule. */
- c3 = CR00*knot[0] + CR01*knot[1]
- + CR02*knot[2] + CR03*knot[3];
- c2 = CR10*knot[0] + CR11*knot[1]
- + CR12*knot[2] + CR13*knot[3];
- c1 = CR20*knot[0] + CR21*knot[1]
- + CR22*knot[2] + CR23*knot[3];
- c0 = CR30*knot[0] + CR31*knot[1]
- + CR32*knot[2] + CR33*knot[3];
-
- return ((c3*x + c2)*x + c1)*x + c0;
- }
-